package com.booksystem.campuslibrarymanagementsystem.controller.admin;

import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.CategoryManagement.Categoryadd;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.CategoryManagement.Categorydelete;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.CategoryManagement.Categorylist;
import com.booksystem.campuslibrarymanagementsystem.commen.request.adminrequest.CategoryManagement.Categoryupdate;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Result;
import com.booksystem.campuslibrarymanagementsystem.commen.result.Verifys;
import com.booksystem.campuslibrarymanagementsystem.entity.AccountTable;
import com.booksystem.campuslibrarymanagementsystem.entity.CategoriesTable;
import com.booksystem.campuslibrarymanagementsystem.service.AccountTableService;
import com.booksystem.campuslibrarymanagementsystem.service.CategoriesTableService;
import com.booksystem.campuslibrarymanagementsystem.utils.AuditUtil;
import com.booksystem.campuslibrarymanagementsystem.utils.JwtUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/Admin")
@Api(tags = "类别管理")
public class CategoryManagementController {
    private final String idt = "admin";
    Verifys verifys = new Verifys();
    CategoriesTable categoriesTable = new CategoriesTable();
    @Autowired
    private CategoriesTableService categoriesTableService;
    @Autowired
    private AccountTableService accountTableService;

    /**
     * 1.类别添加接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Categoryadd（token，categoryname）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：查询是否存在categoryname这个图书类别
     * 6.存在：返回失败信息-已存在该类别，不存在:获取最后一条数据id并加1，并和类别名称一起保存到categoriesTable对象中进行保存
     * 7.保存失败：返回失败信息-类别添加失败，保存成功-返回成功信息-类别添加成功
     */
    @PostMapping("/categoryAdd")
    @ApiOperation(value = "类别添加", notes = "类别添加")
    public Result categoryAdd(@RequestBody Categoryadd categoryadd) {
        verifys = AuditUtil.verifyUtil(categoryadd.getToken(), idt, accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                CategoriesTable categoriesTable1 = categoriesTableService.queryByCategoryName(categoryadd.getCategoryname());
                if (categoriesTable1 == null) {
                    CategoriesTable categoriesTable2 = categoriesTableService.selectLastCategoryid();
                    categoriesTable.setCategoryid(categoriesTable2.getCategoryid() + 1);
                    categoriesTable.setCategoryname(categoryadd.getCategoryname());
                    boolean a = categoriesTableService.save(categoriesTable);
                    if (a) {
                        System.out.println(categoryadd.getCategoryname() + "类别添加成功");
                        return Result.success("类别添加成功", 1);
                    } else {
                        return Result.fail("类别添加失败");
                    }
                } else {
                    return Result.fail("已存在该类别");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 2.类别修改接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Categoryupdate（token，categoryid，categoryname）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：判断该类别是否存在
     * 6.不存在：返回失败信息-该类别不存在，存在：判断更新后的名称和旧名称是否一致
     * 7.一致：返回失败信息-与旧类别名称一致。不一致：进行更新
     * 8.更新失败：返回失败信息-更新失败。更新成功：返回成功信息-更新成功
     */
    @PostMapping("/categoryUpdate")
    @ApiOperation(value = "类别修改", notes = "类别修改")
    public Result categoryUpdate(@RequestBody Categoryupdate categoryupdate) {
        verifys = AuditUtil.verifyUtil(categoryupdate.getToken(), idt, accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                categoriesTable = categoriesTableService.queryByCategoryId(categoryupdate.getCategoryid());
                if (categoriesTable != null) {
                    if (!categoryupdate.getCategoryname().equals(categoriesTable.getCategoryname())) {
                        boolean a = categoriesTableService.upDataName(categoriesTable.getCategoryid(), categoryupdate.getCategoryname());
                        if (a) {
                            System.out.println(categoryupdate.getCategoryname() + "类别修改成功");
                            return Result.success("更新成功", 1);
                        } else {
                            return Result.fail("更新失败");
                        }
                    } else {
                        return Result.fail("与旧类别名称一致");
                    }
                } else {
                    return Result.fail("该类别不存在");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }


    /**
     * 3.类别删除接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Categorydelete（token，categoryid）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：判断该类别是否存在
     * 6.不存在：返回失败信息-该类别不存在，存在：判断该类别是否存在
     * 7.不存在：返回失败信息-没有找到该类别，存在：进行数据库中删除
     * 8.删除失败：返回失败信息-删除失败。删除成功-返回成功信息-删除成功
     */
    @PostMapping("/categoryDelete")
    @ApiOperation(value = "类别删除", notes = "类别删除")
    public Result categoryDelete(@RequestBody Categorydelete categorydelete) {
        verifys = AuditUtil.verifyUtil(categorydelete.getToken(), idt, accountTableService);
        switch (verifys.getMsg()) {
            case "成功":
                categoriesTable = categoriesTableService.queryByCategoryId(categorydelete.getCategoryid());
                if (categoriesTable != null) {
                    boolean a = categoriesTableService.deleteByIds(categorydelete.getCategoryid());
                    if (a) {
                        System.out.println(categoriesTable.getCategoryname() + "类别删除成功");
                        return Result.success("删除成功", 1);
                    } else {
                        return Result.fail("删除失败");
                    }
                } else {
                    return Result.fail("没有找到该类别");
                }
            default:
                return Result.fail(verifys.getMsg());
        }
    }

    /**
     * 4.类别列表接口。
     *
     * @return Result.success();or return Result.fail();
     * @RequestBody Categoryupdate（token，categoryid，categoryname）
     * 1.解析获得的token值，并保存到键值对Map-parsed中
     * 2.判断parsed是否为null
     * 3.null：返回失败信息-请输入正确token值。不为null：判断解析到的身份码是否为admin。
     * 4.不为admin；返回失败信息-身份权限不足。是admin：判断解析到的学号是否在account表中存在。
     * 5.不存在：返回失败信息-该学号不存在。存在：判断该类别是否存在
     * 6.不存在：返回失败信息-该类别不存在，存在：查询到所有数据保存到List<CategoriesTable> list中，判断list是否1为空
     * 7.为空：返回失败信息-没有类别数据。不为空：发送list到前端
     */
    @PostMapping("/categoryList")
    @ApiOperation(value = "类别列表", notes = "类别列表")
    public Result<List<CategoriesTable>> categoryList(@RequestBody Categorylist categorylist) {
        List<CategoriesTable> list = categoriesTableService.list();
        if (!list.isEmpty()) {
            System.out.println("类别列表发送成功");
            return Result.success(list, list.size());
        } else {
            return Result.fail("没有类别数据");
        }
    }
}

